<?php
/**
 * Смотрит список авторов, по необходимости замещает объектами.
 *
 * @package default
 * @author lucky
 **/
class AggregatedModel_ItemProcessor_AuthorsField extends AggregatedModel_ItemProcessor_Common implements AggregatedModel_ItemProcessor_Interface
{

	public function __construct($rh)
	{
		$this->rh = $rh;
		$this->store = $rh->ctx->store;
		$this->mm = $this->rh->ctx->mm;
		// это acl_assistant для дергания прав текущего юзера.
		$this->aa = $this->rh->ctx->mm->aa;
		$this->rh->useClass('RL_URLGenerator');
	}

	public function processItem(array $data)
	{
		if (isset($data['Authors']) && is_array($data['Authors'])) {
			$store = $this->store;

			$authors = $data['Authors'];
			foreach ($authors as $k=>$v) {
				if (isset($v['oid'])) {
					$o_author = $store->getObject($v['oid']);
					$author = $o_author->data;
					$author['oid'] = $o_author->id;
					$author['url'] = $this->hrefAuthor($o_author);
					$authors[$k] = $author;
					unset($author);
				} else {
					$author = $v;

					// если юзер может создавать персоны, имплантируем do_create
					//
					// lucky: персона создается, но не сохраняется.
					// таким образом я проверяю эту возможность..
					if ($person = $this->mm->getModel('Person', 'm')->createPerson($this->aa->acl_data['comity_oid'])) {
						$author['do_create'] = $this->newDoCreateAuthor($author, $data);
						unset($person);
					}

					$authors[$k] = $author;
					unset($author);
				}
			}
		}
		$data['Authors'] = $authors;
		return $data;
	}

	/**
	 * newDoCreateAuthor родить новый do_ для создания автора.
	 *
	 * @param array $a {fullname}
	 * @return array do
	 */
	public function newDoCreateAuthor ($a, $data)
	{
		$rule = 'person_create';
		$community = $this->mm->getModel('Community', 'm')->getCommunity($this->aa->acl_data['comity_oid']);
		$params = array(
			'community_url' => $community->data['community_url'],
		);
		$url = $this->generateUrl($rule, $params, array('fullname'=>$a['fullname'], 'for'=>$data['oid']));

		$do = array();
		$do['url'] = $url;
		$do['title'] = 'Создать';
		return $do;
	} // end of method makeDoCreateAuthor

	/**
	 * hrefAuthor создать ссылку на автора.
	 *
	 * @param mixed $o
	 * @return url
	 */
	public function hrefAuthor ($o)
	{
		switch ($o->type) {
		case 'fperson':
			$community = $this->mm->getModel('Community', 'm')->getCommunity($o->data['community_oid']);
			$rule = 'person_show';
			$params = array(
				'community_url' => $community->data['community_url'],
				'oid' => $o->id,
			);
			$url = $this->generateUrl($rule, $params);
			break;
		case 'fpid_user':
			$url = $o->data['platonica.profile_url'];
			break;
		case 'fuser':
			$community = $this->mm->getModel('Community', 'm')->getCommunity($this->aa->acl_data['comity_oid']);
			$rule = 'showmember';
			$params = array(
				'community_url' => $community->data['community_url'],
				'user_url' => $o->id,
			);
			$url = $this->generateUrl($rule, $params);
			break;
		default:
			$url = NULL;
			break;
		}
		return $url;
	} // end of method hrefAuthor

	/**
	 * generateUrl построить url, используя RL_URLGenerator.
	 *
	 * @param string $rule название правила
	 * @param array $params params
	 * @param array $get GET
	 * @return url
	 */
	private function generateUrl ($rule, $params, $get=NULL)
	{
		$ug = new RL_URLGenerator($this->rh->router->getRule($rule));
		$ug->setRouter($this->rh->router);
		$ug->setParams($params);
		$GET = $this->rh->GET;
		if (is_array($get)) $GET = array_merge($GET, $get);
		$ug->setGet($GET);
		$url = $ug->generateUrl();
		return $url;
	} // end of method generateUrl
} // END class
